package com.tongan.entity.config;

import com.alibaba.fastjson.annotation.JSONField;
import com.tongan.database.JeecgReadTable;
import com.tongan.entity.button.CgformButtonEntity;
import lombok.Getter;
import lombok.Setter;
import org.apache.commons.lang3.StringUtils;
import org.codehaus.jackson.annotate.JsonIgnore;
import org.hibernate.annotations.DynamicInsert;
import org.hibernate.annotations.DynamicUpdate;
import org.hibernate.annotations.GenericGenerator;
import org.hibernate.annotations.OrderBy;

import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;

/**   
 * @Title: Entity
 * @Description: 自动生成表属性
 * @author jueyue
 * @date 2013-06-30 11:36:53
 * @version V1.0   
 *
 */
@Entity
@Table(name = "cgform_head", schema = "")
@DynamicUpdate(true)
@DynamicInsert(true)
@Setter
@Getter
@SuppressWarnings("serial")
public class CgFormHeadEntity implements java.io.Serializable {
	/**id*/
	@Id
	@GeneratedValue(generator = "paymentableGenerator")
	@GenericGenerator(name = "paymentableGenerator", strategy = "uuid")
	@Column(name ="id",nullable=false,length=32)
	private String id;
	/**表格名称*/
	@Column(name ="table_name",nullable=false,length=50)
	private String tableName;

	public void setTableName(String tableName) {
		this.tableName = tableName;
	}

	/**
	 * [模版使用变量]获取实体类名
	 * @return
	 */
	public String getEntityName(){
		String cu= StringUtils.capitalize(getTableName());
		return cu;
	}

	/**
	 * [模版使用变量]获取变量形式的名
	 * @return
	 */
	public String getVariableName(){
		String xx= StringUtils.uncapitalize(StringUtils.capitalize(getTableName()));
		return xx;
	}

	/**dategrid是否为树形*/
	@Column(name ="is_tree",nullable=false,length=5)
	private String isTree;
	/**datagrid是否分页*/
	@Column(name ="is_pagination",nullable=false,length=5)
	private String isPagination;
	/**是否同步了数据库*/
	@Column(name ="is_dbsynch",nullable=false,length=20)
	private String isDbSynch;
	/**datagrid是否显示复选框*/
	@Column(name ="is_checkbox",nullable=false,length=5)
	private String isCheckbox;
	/**查询模式：single(单条件查询：默认),group(组合查询)*/
	@Column(name ="querymode",nullable=false,length=10)
	private String querymode;
	/**功能注释*/
	@Column(name ="content",nullable=false,length=200)
	private String content;
	/**创建时间*/
	@Column(name ="create_date",nullable=true)
	private java.util.Date createDate;
	/**创建人ID*/
	@Column(name ="create_by",nullable=true,length=32)
	private String createBy;
	/**创建人名称*/
	@Column(name ="create_name",nullable=true,length=32)
	private String createName;
	/**修改时间*/
	@Column(name ="update_date",nullable=true)
	private java.util.Date updateDate;
	/**修改人*/
	@Column(name ="update_by",nullable=true,length=32)
	private String updateBy;
	/**修改人名称*/
	@Column(name ="update_name",nullable=true,length=32)
	private String updateName;
	/**表单版本*/
	@Column(name ="jform_version",nullable=false,length=10)
	private String jformVersion;
	/**表单类型 4多对多*/
	@Column(name ="jform_type",nullable=false,length=1)
	private Integer jformType;
	/**表单主键策略*/
	@Column(name ="jform_pk_type",nullable=true,length=100)
	private String jformPkType;
	/**表单主键策略-序列(针对oracle等数据库)*/
	@Column(name ="jform_pk_sequence",nullable=true,length=200)
	private String jformPkSequence;
	/**附表关联类型*/
	@Column(name ="relation_type",nullable=true,length=1)
	private Integer relationType;
	/**附表清单*/
	@Column(name ="sub_table_str",nullable=true,length=1000)
	private String subTableStr;
	/**一对多Tab顺序*/
	@Column(name ="tab_order", nullable=true, length=1)
	private Integer tabOrder;
	/**
	 * 表格列属性
	 */
	@JsonIgnore
	@JSONField(serialize = false)
	@OneToMany(cascade=CascadeType.REMOVE,mappedBy="table")
	@OrderBy(clause="orderNum asc")
	private List<CgFormFieldEntity> columns;
	@JsonIgnore
	public List<CgFormFieldEntity> getColumns() {
		return columns;
	}

	/**
	 * 索引
	 */
	@JSONField(serialize = false)
	@OneToMany(cascade=CascadeType.REMOVE,mappedBy="table")
	private List<CgFormIndexEntity> indexes;

	/**树形列表 父id列名*/
	@Column(name ="tree_parentid_fieldname",nullable=true,length=50)
	private String treeParentIdFieldName;
	/**树形列表 id列名*/
	@Column(name ="tree_id_fieldname",nullable=true,length=50)
	private String treeIdFieldname;
	/**树形列表 菜单列名*/
	@Column(name ="tree_fieldname",nullable=true,length=50)
	private String treeFieldname;

	/**表单分类*/
	@Column(name ="jform_category",nullable=false,length=50)
	private String jformCategory;

	/**表单模板*/
	@Column(name ="form_template",length=50)
	private String formTemplate;

	/**表单模板样式(移动端)*/
	@Column(name ="form_template_mobile",length=50)
	private String formTemplateMobile;

	/**表单类型，0为物理表，1为配置表*/
	@Column(name ="table_type",length=50)
	private String tableType;
	/**配置表版本*/
	@Column(name ="table_version",length=11)
	private Integer tableVersion;
	/**物理表id*/
	@Column(name ="physice_id",length=32)
	private String physiceId;

	/**
	 * 管理数据是否能被增加
	 * 像日志这种表的数据是不能被增加 所以就不能有增加方法 及访问接口
	 */
	boolean addable;
	/**
	 * 管理数据是否能被删除
	 * 像日志这种表的数据是不能被删除 所以就不能有删除方法 及访问接口
	 */
	boolean deletable;

	/**
	 * 引用数据源
	 */
	@Column(name = "ref_datasource")
	private String refDatasource;

	/**
	 * 父表ID 父表一般在操作界面用来快捷添加一些常用字段
	 * 在模版方面 用来区别继承的字段 就是字段出现在父表里的 不输出在entity类里
	 */
	@Column(name = "extendFormId")
	private String extendFormId;

	/**
	 * 父表实例
	 */
	@Transient
	private CgFormHeadEntity extendCgFormHeadEntity;

	/**
	 * 主要显示字段
	 * 意思是在其他模块引用该模块数据时对应的显示名称
	 * 如 数据库存储为 studentID 但是显示的时候是显示学生的姓名
	 */
	@Transient
	private String mainShowFieldName;

	@Transient
	private List<CgFormFieldEntity> manyToManyFields;

	/**
	 * 方便管理及模版引用等
	 */
	@Transient
	private List<CgformButtonEntity> buttons=new ArrayList<>();

	public String getTreeParentIdFieldNamePage() {
		if(StringUtils.isNotEmpty(treeParentIdFieldName)){
			return JeecgReadTable.formatField(treeParentIdFieldName);
		}
		return "";
	}

	public String getTreeFieldnamePage() {
		if(StringUtils.isNotEmpty(treeFieldname)){
			return JeecgReadTable.formatField(treeFieldname);
		}
		return "";
	}

	/**
	 * 是否是作为父类
	 * @return
	 */
	public boolean isSuperClass(){

		try {
			boolean is= (getEntityName().toLowerCase().startsWith("base") ||StringUtils.isBlank(getExtendFormId()))&& getJformType()!=4;
			return is;
		} catch (Exception e) {
			return false;
		}
	}

}
